home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / foo2hp2600-wrapper < prev    next >
Text File  |  2009-10-19  |  18KB  |  785 lines

  1. #!/bin/sh
  2.  
  3. #* Copyright (C) 2005-2006  Rick Richardson
  4. #*
  5. #* This program is free software; you can redistribute it and/or modify
  6. #* it under the terms of the GNU General Public License as published by
  7. #* the Free Software Foundation; either version 2 of the License, or
  8. #* (at your option) any later version.
  9. #*
  10. #* This program is distributed in the hope that it will be useful,
  11. #* but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. #* GNU General Public License for more details.
  14. #*
  15. #* You should have received a copy of the GNU General Public License
  16. #* along with this program; if not, write to the Free Software
  17. #* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. #*
  19. #* Authors: Rick Richardson <rick.richardson@comcast.net>
  20.  
  21. VERSION='$Id: foo2hp2600-wrapper.in,v 1.65 2009/05/11 17:35:55 rick Exp $'
  22.  
  23. #
  24. # Printer Notes:
  25. #
  26. # HP Color LaserJet 1600:    -z0
  27. # HP Color LaserJet 2600n:    -z0
  28. # HP Color LaserJet CP1215:    -z1
  29. #
  30.  
  31. PROGNAME="$0"
  32. BASENAME=`basename $PROGNAME`
  33. PREFIX=/usr
  34. SHARE=$PREFIX/share/foo2hp
  35. PATH=$PATH:/sw/bin:/opt/local/bin
  36.  
  37. #
  38. #    Log the command line, for debugging and problem reports
  39. #
  40. if [ -x /usr/bin/logger -o -x /bin/logger ]; then
  41.     logger -t "$BASENAME" -p lpr.info -- "$BASENAME $@" </dev/null
  42. fi
  43.  
  44. usage() {
  45.     cat <<EOF
  46. Usage:
  47.     $BASENAME [options] [ps-file]
  48.  
  49.     Foomatic printer wrapper for the foo2hp2600 printer driver.
  50.     This script reads a Postscript ps-file or standard input
  51.     and converts it to Zenographics ZjStream printer format.
  52.  
  53. Normal Options:
  54. -b bits           Bits per plane (1 or 2) [$BPP]
  55. -c                Print in color (else monochrome)
  56. -d duplex         Duplex code to send to printer [$DUPLEX]
  57.                     1=off, 2=longedge, 3=shortedge
  58. -m media          Media code to send to printer [$MEDIA]
  59.                     1=standard, 2=transparency, 3=glossy, 257=envelope,
  60.                     259=letterhead, 261=thickstock, 262=postcard, 263=labels
  61. -p paper          Paper code [$PAPER]
  62.                     1=letter, 5=legal, 7=executive, 9=A4, 11=A5, 13=B5
  63.                     20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch
  64. -n copies         Number of copies [$COPIES]
  65. -r <xres>x<yres>  Set device resolution in pixels/inch [$RES]
  66. -s source         Source code to send to printer [$SOURCE]
  67.                     1=tray2, 2=tray3, 4=manual/tray1, 7=auto
  68.             Code numbers may vary with printer model.
  69. -t                Draft mode.  Every other pixel is white.
  70. -2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
  71.                   Print with N-up (requires psutils)
  72. -o orient         For N-up: -op is portrait, -ol is landscape, -os is seascape.
  73.  
  74. Printer Tweaking Options:
  75. -u <xoff>x<yoff>  Set offset of upper left printable in pixels [varies]
  76. -l <xoff>x<yoff>  Set offset of lower right printable in pixels [varies]
  77. -L mask           Send logical clipping values from -u/-l in ZjStream [3]
  78.                   0=no, 1=Y, 2=X, 3=XY
  79. -P                Do not output START_PLANE codes.  May be needed by some
  80.                   monochrome-only printers.
  81. -X padlen         Add extra zero padding to the end of BID segments [16]
  82. -z model          Model: 0=HP CLJ 1600/2600n; 1=HP CLJ CP1215 [$MODEL]
  83.  
  84. Color Tweaking Options:
  85. -g gsopts         Additional options to pass to Ghostscript, such as
  86.                   -dDITHERPPI=nnn, etc.  May appear more than once. []
  87. -G profile.icm    Convert profile.icm to a Postscript CRD using icc2ps and
  88.                   adjust colors using the setcolorrendering PS operator.
  89.                   $SHARE/icm/ will be searched for profile.icm.
  90. -I intent         Select profile intent from ICM file [$INTENT]
  91.                   0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
  92. -G gamma-file.ps  Prepend gamma-file to the Postscript input to perform
  93.                   color correction using the setcolortransfer PS operator.
  94.  
  95. Debugging Options:
  96. -S plane          Output just a single color plane from a color print [all]
  97.                   1=Cyan, 2=Magenta, 3=Yellow, 4=Black
  98. -D lvl            Set Debug level [$DEBUG]
  99. -V                $VERSION
  100. EOF
  101.  
  102.     exit 1
  103. }
  104.  
  105. #
  106. #       Report an error and exit
  107. #
  108. error() {
  109.     echo "$BASENAME: $1" >&2
  110.     exit 1
  111. }
  112.  
  113. dbgcmd() {
  114.     if [ $DEBUG -ge 1 ]; then
  115.         echo "$@" >&2
  116.     fi
  117.     "$@"
  118. }
  119.  
  120. #
  121. # Portable version of 'which'
  122. #
  123. pathfind() {
  124.     if [ "$1" = -p ]; then
  125.     optp=1
  126.     shift
  127.     else
  128.     optp=0
  129.     fi
  130.     OLDIFS="$IFS"
  131.     IFS=:
  132.     for p in $PATH; do
  133.     if [ -x "$p/$*" ]; then
  134.         if [ $optp = 1 ]; then
  135.         echo "$p/$*"
  136.         fi
  137.         IFS="$OLDIFS"
  138.         return 0
  139.     fi
  140.     done
  141.     IFS="$OLDIFS"
  142.     return 1
  143. }
  144.  
  145. #
  146. # Returns true if $1 is 32-bit binary
  147. #
  148. is32() {
  149.     if pathfind file; then
  150.     path=`pathfind -p "$*"`
  151.     is32=`file -L "$path" | grep 32-bit` 
  152.     if [ "$is32" = "" ]; then
  153.         return 1
  154.     else
  155.         return 0
  156.     fi
  157.     else
  158.     return 1
  159.     fi
  160. }
  161.  
  162. #
  163. #    N-up-ify the job.  Requires psnup from psutils package
  164. #
  165. nup() {
  166.     case "$NUP" in
  167.     [2368]|1[0458])
  168.     tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
  169.     ;;
  170.     [49]|1[26])
  171.     tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
  172.     ;;
  173.     *)
  174.     error "Illegal call to nup()."
  175.     ;;
  176.     esac
  177. }
  178.  
  179. #
  180. #       Process the options
  181. #
  182.  
  183. # Try to use a local copy of GhostScript 8.54, if available.  Otherwise,
  184. # fallback to whatever the Linux distro has installed (usually 7.07)
  185. #
  186. # N.B. := operator used here, when :- would be better, because "ash"
  187. # doesn't have :-
  188. if gs.foo -v >/dev/null 2>&1; then
  189.         GSBIN=${GSBIN:-gs.foo}
  190. else
  191.         GSBIN=${GSBIN:-gs}
  192. fi
  193.  
  194. CMDLINE="$*"
  195. DEBUG=0
  196. DUPLEX=1
  197. BPP=1
  198. COLOR=
  199. COLORMODE=default
  200. MODEL=0
  201. QUALITY=1
  202. QUALITY=wts
  203.  
  204. MEDIA=1
  205. COPIES=1
  206. test -r /etc/papersize && PAPER=$(cat /etc/papersize)
  207. test "$PAPER" || PAPER=1
  208. RES=600x600
  209. SOURCE=7
  210. NUP=
  211. CLIP_UL=
  212. CLIP_LR=
  213. CLIP_LOG=
  214. BC=
  215. AIB=
  216. NOPLANES=
  217. COLOR2MONO=
  218. GAMMAFILE=default
  219. INTENT=0
  220. GSOPTS=
  221. EXTRAPAD=
  222. SAVETONER=
  223. NUP_ORIENT=
  224. GSDEV=-sDEVICE=pbmraw
  225. SEGFAULT=0
  226. # What mode to use if the user wants us to pick the "best" mode
  227. case `$GSBIN --version` in
  228. 7*)
  229.     DEFAULTCOLORMODE=10
  230.     ;;
  231. 8.1*)
  232.     # Buggy 8.14/8.15 in Ubuntu
  233.     DEFAULTCOLORMODE=10
  234.     if is32 $GSBIN; then
  235.         GAMMAFILE=km2430_2.icm
  236.     else
  237.         GAMMAFILE=hpclj2600n-0.icm
  238.     SEGFAULT=1
  239.     fi
  240.     QUALITY=1
  241.     ;;
  242. *)
  243.     DEFAULTCOLORMODE=10
  244.     ;;
  245. esac
  246.  
  247. while getopts "1:23456789o:b:cC:d:g:l:u:L:m:n:p:q:r:s:tz:ABS:D:G:I:PX:Vh?" opt
  248. do
  249.     case $opt in
  250.     b)    BPP="$OPTARG";;
  251.     c)    COLOR=-c;;
  252.     d)    DUPLEX="$OPTARG";;
  253.     g)    GSOPTS="$GSOPTS $OPTARG";;
  254.     m)    MEDIA="$OPTARG";;
  255.     n)    COPIES="$OPTARG";;
  256.     p)    PAPER="$OPTARG";;
  257.     q)    QUALITY="$OPTARG";;
  258.     r)    RES="$OPTARG";;
  259.     s)    SOURCE="$OPTARG";;
  260.     t)    SAVETONER="-t";;
  261.     z)    MODEL="$OPTARG";;
  262.     l)    CLIP_LR="-l $OPTARG";;
  263.     u)    CLIP_UL="-u $OPTARG";;
  264.     L)    CLIP_LOG="-L $OPTARG";;
  265.     A)    AIB=-A;;
  266.     B)    BC=-B;;
  267.     C)    COLORMODE="$OPTARG";;
  268.     S)    COLOR2MONO="-S$OPTARG";;
  269.     D)    DEBUG="$OPTARG";;
  270.     G)    GAMMAFILE="$OPTARG";;
  271.     I)    INTENT="$OPTARG";;
  272.     P)    NOPLANES=-P;;
  273.     X)    EXTRAPAD="-X $OPTARG";;
  274.     [234689])    NUP="$opt";;
  275.     [57])    error "Can't find acceptable layout for $opt-up";;
  276.     1)    case "$OPTARG" in
  277.         [024568])    NUP="1$OPTARG";;
  278.         *)    error "Can't find acceptable layout for 1$OPTARG-up";;
  279.         esac
  280.         ;;
  281.     o)    case "$OPTARG" in
  282.         l*)    NUP_ORIENT=-l;;
  283.         s*)    NUP_ORIENT=-r;;
  284.         p*|*)    NUP_ORIENT=;;
  285.         esac;;
  286.     V)    echo "$VERSION"; foo2hp -V; foo2zjs-pstops -V; exit 0;;
  287.     h|\?)
  288.         if [ "$CMDLINE" != "-?" -a "$CMDLINE" != -h ]; then
  289.             echo "Illegal command:"
  290.             echo "    $0 $CMDLINE"
  291.             echo
  292.         fi
  293.         usage;;
  294.     esac
  295. done
  296. shift `expr $OPTIND - 1`
  297.  
  298. #
  299. # If there is an argument left, take it as the file to print.
  300. # Else, the input comes from stdin.
  301. #
  302. if [ $# -ge 1 ]; then
  303.     if [ "$LPJOB" = "" ]; then
  304.     : # LPJOB="$1"
  305.     fi
  306.     exec < $1
  307. fi
  308.  
  309.  
  310. #
  311. #    Select the ghostscript device to use
  312. #
  313. case "$BPP" in
  314. 1)    if [ "" = "$COLOR" ]; then
  315.         GSDEV=-sDEVICE=pbmraw
  316.     else
  317.         GSDEV=-sDEVICE=bitcmyk
  318.     fi
  319.     case "$GAMMAFILE" in
  320.     default)
  321.         case "$MODEL" in
  322.         0)
  323.         if [ $SEGFAULT = 0 ]; then
  324.             GAMMAFILE=hpclj2600n-1.icm
  325.         else
  326.             GAMMAFILE=hpclj2600n-0.icm
  327.         fi
  328.         ;;
  329.         1)
  330.         GAMMAFILE=hp1215-argyll-0.icm
  331.         ;;
  332.         esac
  333.         ;;
  334.     none) GAMMAFILE=;;
  335.     esac
  336.     ;;
  337. 2)    if [ "" = "$COLOR" ];
  338.     then
  339.         # GSDEV=-sDEVICE=pgmraw
  340.         # error "2-bpp monochrome is not yet supported"
  341.         GSDEV="-sDEVICE=cups -dcupsColorSpace=3 -dcupsBitsPerColor=2"
  342.         GSDEV="$GSDEV -dcupsColorOrder=2"
  343.     else
  344.         GSDEV="-sDEVICE=cups -dcupsColorSpace=6 -dcupsBitsPerColor=2"
  345.         GSDEV="$GSDEV -dcupsColorOrder=2"
  346.     fi
  347.     if [ $GSBIN = "gs.foo" ]; then
  348.         GSBIN=gs
  349.     fi
  350.  
  351.     case "$GAMMAFILE" in
  352.     default) 
  353.         case "$MODEL" in
  354.         0)
  355.         if is32 $GSBIN; then
  356.             GAMMAFILE=km2430_2.icm
  357.             GAMMAFILE=hpclj2600n-1.icm
  358.         else
  359.             GAMMAFILE=
  360.         fi
  361.         ;;
  362.         1)
  363.         GAMMAFILE=hp1215-argyll-0.icm
  364.         ;;
  365.         esac
  366.         ;;
  367.     none) GAMMAFILE=;;
  368.     esac
  369.     ;;
  370. *)    error "Illegal number of bits per plane ($BPP)";;
  371. esac
  372.  
  373. #
  374. #    Validate model code
  375. #
  376. case "$MODEL" in
  377. 0|1)    ;;
  378. *)    error "Unknown model code $MODEL";;
  379. esac
  380.  
  381. #
  382. case "$QUALITY" in
  383. 0)
  384.     GSOPTS="-dCOLORSCREEN $GSOPTS"
  385.     ;;
  386. 1)
  387.     GSOPTS="-dCOLORSCREEN $GSOPTS"
  388.     ;;
  389. 2)
  390.     GSOPTS="-dMaxBitmap=500000000 $GSOPTS"
  391.     ;;
  392. wts)
  393.     GSOPTS="-dCOLORSCREEN -dMaxBitmap=500000000 $GSOPTS"
  394.     ;;
  395. esac
  396.  
  397. #
  398. #    Validate media code
  399. #
  400. case "$MEDIA" in
  401. 1|plain)    MEDIA=1;;
  402. 514|preprinted)    MEDIA=514;;
  403. 513|letterhead)    MEDIA=513;;
  404. 2|transparency)    MEDIA=2;;
  405. 515|prepunched)    MEDIA=515;;
  406. 265|labels)    MEDIA=265;;
  407. 260|bond)    MEDIA=260;;
  408. 516|recycled)    MEDIA=516;;
  409. 512|color)    MEDIA=512;;
  410. 276|tough)    MEDIA=276;;
  411. 267|envelope)    MEDIA=267;;
  412. 258|light)    MEDIA=258;;
  413. 262|heavy)    MEDIA=262;;
  414. 261|cardstock)    MEDIA=261;;
  415. 268|lightglossy)    MEDIA=268;;
  416. 269|glossy)    MEDIA=269;;
  417. 270|heavyglossy)    MEDIA=270;;
  418. 277|cover)    MEDIA=277;;
  419. 278|photo)    MEDIA=278;;
  420. [0-9]*)        ;;
  421. *)        error "Unknown media code $MEDIA";;
  422. esac
  423.  
  424. #
  425. #    Validate source (InputSlot) code
  426. #
  427. case "$SOURCE" in
  428. 1|tray2)    SOURCE=1;;
  429. 4|tray1)    SOURCE=4;;
  430. 7|auto)        SOURCE=7;;
  431. [0-9]*)        ;;
  432. *)        error "Unknown source code $SOURCE";;
  433. esac
  434.  
  435. #
  436. #    Validate Duplex code
  437. #
  438. case "$DUPLEX" in
  439. 1|off|none)    DUPLEX=1;;
  440. 2|long*)    DUPLEX=2;;
  441. 3|short*)    DUPLEX=3;;
  442. [0-9]*)        ;;
  443. *)        error "Unknown duplex code $DUPLEX";;
  444. esac
  445.  
  446. #
  447. #    Validate Resolution
  448. #
  449. case "$RES" in
  450. 600x600)    ;;
  451. 1200x600)    ;;
  452. 2400x600)    ;;
  453. *)        error "Illegal resolution $RES";;
  454. esac
  455.  
  456. #
  457. #    Figure out the paper dimensions in pixels/inch, and set the
  458. #    default clipping region.  Unfortunately, this is a trouble
  459. #    area for ZjStream printers.  Various versions of ZjS print
  460. #    engines react differently when asked to print into their
  461. #    unprintable regions.
  462. #
  463. set_clipping() {
  464.     ulx=$1; uly=$2
  465.     lrx=$3; lry=$4
  466.  
  467.     # Set clipping region if it isn't already set
  468.     if [ "$CLIP_UL" = "" ]; then
  469.     case "$RES" in
  470.     600x600)    ulx=`expr $ulx / 2`;;
  471.     2400x600)    ulx=`expr $ulx \* 2`;;
  472.     esac
  473.     CLIP_UL="-u ${ulx}x${uly}"
  474.     fi
  475.     if [ "$CLIP_LR" = "" ]; then
  476.     case "$RES" in
  477.     600x600)    lrx=`expr $lrx / 2`;;
  478.     2400x600)    lrx=`expr $lrx \* 2`;;
  479.     esac
  480.     CLIP_LR="-l ${lrx}x${lry}"
  481.     fi
  482. }
  483.  
  484. case "$PAPER" in
  485. Custom*)
  486.         case "$PAPER" in
  487.         Custom\.[0-9]*\x[0-9]*)
  488.             XDIM=`echo "$PAPER" | sed -e 's/Custom\.//' -e 's/x.*//'`
  489.             YDIM=`echo "$PAPER" | sed -e 's/Custom\.//' -e 's/.*x//'`
  490.             ;;
  491.         *)
  492.         #%%BeginFeature: *CustomPageSize True
  493.         #216
  494.         #360
  495.         #0
  496.         #0
  497.         #0
  498.         #pop pop pop pop pop
  499.  
  500.         #%%BeginFeature: *CustomPageSize True
  501.         #792.000000 612.000000 1 0.000000 0.000000
  502.         #pop pop pop pop pop
  503.  
  504.         if [ $DEBUG = 0 ]; then
  505.             TMPFILE=/tmp/cus$$
  506.         else
  507.             TMPFILE=/tmp/custom.ps
  508.         fi
  509.         cat >$TMPFILE
  510.         exec <$TMPFILE
  511.  
  512.         tmp=`head -n 10000 $TMPFILE \
  513.             | sed -n '/CustomPageSize/{n;p;n;p;}' \
  514.             | tr '\n' ' '`
  515.         case "$tmp" in
  516.         [0-9]*\ [0-9]*)
  517.             XDIM=`echo "$tmp" | sed 's/ .*//'`
  518.             YDIM=`echo "$tmp" | sed -e 's/^[^ ]* //' -e 's/ .*//'`
  519.             ;;
  520.         *)
  521.             if [ $DEBUG = 0 ]; then rm -f $TMPFILE; fi
  522.             error "Custom page size [XY]DIM != 1-99999"
  523.             ;;
  524.         esac
  525.         ;;
  526.         esac
  527.         XDIM=`dc -e "$XDIM 1200* 72/p"`
  528.         YDIM=`dc -e "$YDIM 600* 72/p"`
  529.         PAPER=1;        paper=letter;
  530.                 set_clipping 2 80     2 80
  531.         ;;
  532. 1|letter)    PAPER=1;    paper=letter;    XDIM="10200"; YDIM="6600"
  533.         set_clipping 172 80    172 80
  534.         ;;
  535. 5|legal)    PAPER=5;    paper=legal;     XDIM="10200"; YDIM="8400"
  536.         set_clipping 172 80    172 80
  537.         ;;
  538. 7|executive)    PAPER=7;    paper=executive; XDIM="8700";  YDIM="6300"
  539.         set_clipping 174 78    174 78
  540.         ;;
  541. 9|a4|A4)    PAPER=9;    paper=a4;        XDIM="9920";  YDIM="7016"
  542.         set_clipping 176 84    176 84
  543.         ;;
  544. 11|a5|A5)    PAPER=11;    paper=a5;        XDIM="6992";  YDIM="4960"
  545.         set_clipping 176 80    176 80
  546.         ;;
  547. 13|b5|B5|b5jis)    PAPER=13;    paper=b5;        XDIM="8598";  YDIM="6070"
  548.         set_clipping 172 83    171 83
  549.         ;;
  550. 20|"env#10")    PAPER=20;    paper=env10;     XDIM="4950";  YDIM="5700"
  551.         set_clipping 171 78    171 78
  552.         ;;
  553. 27|envDL)    PAPER=27;    paper=envDL;     XDIM="5200";  YDIM="5200"
  554.         set_clipping 176 84    176 84
  555.         ;;
  556. 28|envC5)    PAPER=28;    paper=envC5;     XDIM="7650";  YDIM="5408"
  557.         set_clipping 170 80    169 80
  558.         ;;
  559. 34|envB5)    PAPER=34;    paper=envB5;     XDIM="8316";  YDIM="5892"
  560.         set_clipping 174 74    174 74
  561.         ;;
  562. 37|envMonarch)    PAPER=37;    paper=envMonarch;XDIM="4650";  YDIM="4500"
  563.         set_clipping 174 78    173 78
  564.         ;;
  565. *)        error "Unimplemented paper code $PAPER";;
  566. esac
  567. # e.g. /usr/share/ghostscript/7.07/lib/gs_statd.ps
  568. PAPERSIZE="-sPAPERSIZE=$paper";
  569.  
  570. case "$RES" in
  571. 600x600)    XDIM=`expr $XDIM / 2`;;
  572. 1200x600)    ;;
  573. 2400x600)    XDIM=`expr $XDIM \* 2`;;
  574. esac
  575. DIM="${XDIM}x${YDIM}"
  576.  
  577. #
  578. # Filter thru psnup if N-up printing has been requested
  579. #
  580. case $NUP in
  581. [234689]|1[024568])    PREFILTER="nup";;
  582. *)            PREFILTER=cat;;
  583. esac
  584. if [ "$DEBUG" -ge 9 ]; then
  585.     PREFILTER="tee /tmp/$BASENAME.ps"
  586. fi
  587.  
  588. #
  589. #    Overload -G.  If the file name ends with ".icm" or ".ICM"
  590. #    then convert the ICC color profile to a Postscript CRD,
  591. #    then prepend it to the users job.  Select the intent
  592. #    using the -I option.
  593. #
  594.  
  595. create_crd() {
  596.     #
  597.     # Create a Postscript CRD
  598.     #
  599.     ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
  600.     if [ -x $ICC2PS ]; then
  601.     case "$GAMMAFILE" in
  602.     none.icm | */none.icm)
  603.         ;;
  604.     *)
  605.         if [ -x /usr/bin/logger ]; then
  606.         logger -t "$BASENAME" -p lpr.info -- \
  607.         "`basename $ICC2PS` -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps"
  608.         fi
  609.         $ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
  610.         || error "Problem converting .ICM file to Postscript"
  611.         ;;
  612.     esac
  613.  
  614.     PSTOPS_OPTS="$PSTOPS_OPTS -c"
  615.     cat > $ICCTMP.usecie.ps <<-EOF
  616.         %!PS-Adobe-3.0
  617.         <</UseCIEColor true>>setpagedevice
  618.     EOF
  619.     if [ "$QUALITY" = wts ]; then
  620.         cat >> $ICCTMP.usecie.ps <<-EOF
  621.         << /UseWTS true >> setuserparams
  622.         <<
  623.             /AccurateScreens true
  624.             /HalftoneType 1
  625.             /HalftoneName (Round Dot Screen) cvn
  626.             /SpotFunction { 180 mul cos exch 180 mul cos add 2 div}
  627.             /Frequency 137
  628.             /Angle 37
  629.         >> sethalftone
  630.         EOF
  631.     fi
  632.     cat > $ICCTMP.selcrd.ps <<-EOF
  633.         /Current /ColorRendering findresource setcolorrendering
  634.     EOF
  635.     case "$GAMMAFILE" in
  636.     none.icm | */none.icm) GAMMAFILE="$ICCTMP.usecie.ps";;
  637.     *)    GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps";;
  638.     esac
  639.     else
  640.     GAMMFILE=
  641.     fi
  642. }
  643.  
  644. if [ $DEBUG -gt 0 ]; then
  645.     ICCTMP=/tmp/icc
  646. else
  647.     ICCTMP=/tmp/icc$$
  648. fi
  649.  
  650. if [ "" = "$COLOR" ]; then
  651.     COLORMODE=
  652.     GAMMAFILE=
  653. else
  654.     case "$COLORMODE" in
  655.     default)    COLORMODE=$DEFAULTCOLORMODE;;
  656.     esac
  657. fi
  658.  
  659. CRDBASE="$PREFIX/share/foo2zjs/crd"
  660. PSFILES="$PREFIX/share/foo2hp/psfiles"
  661. case "$RES" in
  662.     600x600)    SCREEN=screen1200.ps;;
  663.     1200x600)    SCREEN=screen1200.ps;;
  664.     2400x600)    SCREEN=screen2400.ps;;
  665. esac
  666.  
  667. PSTOPS_OPTS="-n"
  668.  
  669. case "$COLORMODE" in
  670. 0|"")
  671.     # Monochrome
  672.     ;;
  673. 10|icm)
  674.     # Use old ICM method
  675.     AIB=-A
  676.     BC=-B
  677.     case "$GAMMAFILE" in
  678.     none.icm | */none.icm)
  679.     create_crd
  680.     ;;
  681.     *.icm|*.ICM|*.icc|*.ICC)
  682.     #
  683.     # Its really an .ICM file, not a gamma file.
  684.     #
  685.     # The file can be a full path name, or the name of a file in $SHARE/icm/
  686.     #
  687.     if [ -r "$GAMMAFILE" ]; then
  688.         create_crd
  689.     elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
  690.         GAMMAFILE="$SHARE/icm/$GAMMAFILE"
  691.         create_crd
  692.     else
  693.         GAMMAFILE=
  694.     fi
  695.     ;;
  696.     esac
  697.     ;;
  698. *.crd)
  699.     GAMMAFILE="$CRDBASE/prolog.ps"
  700.     if [ -f $COLORMODE ]; then
  701.     GAMMAFILE="$GAMMAFILE $COLORMODE"
  702.     elif [ -f $CRDBASE/$COLORMODE ]; then
  703.     GAMMAFILE="$GAMMAFILE $CRDBASE/$COLORMODE"
  704.     else
  705.     error "Can't find CRD '$COLORMODE' in . or in $CRDBASE"
  706.     fi
  707.     GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
  708.     ;;
  709. *)
  710.     error "Unknown color method '$COLORMODE'"
  711.     ;;
  712. esac
  713.  
  714. if [ "$COLOR" != "" -a "$QUALITY" = wts ]; then
  715.     PSTOPS_OPTS="$PSTOPS_OPTS -w"
  716. fi
  717.  
  718. if [ "" != "$COLOR" ]; then
  719.     if [ "" = "$AIB" -a "" = "$BC" ]; then
  720.     # Faster, but can't handle AllIsBlack or BlackClears
  721.     : #GSDEV=-sDEVICE=pksmraw
  722.     else
  723.     # Can't handle different size pages
  724.     : #GSDEV=-sDEVICE=bitcmyk
  725.     fi
  726. fi
  727.  
  728. #
  729. #    Figure out USERNAME
  730. #
  731. if [ "$LPUSER" != "" ]; then
  732.     USER="$LPUSER@$LPHOST"
  733. else
  734.     USER=""
  735. fi
  736.  
  737. #
  738. #    Main Program, just cobble together the pipeline and run it
  739. #
  740. #    The malarky with file descriptors 1 and 3 is to avoid a bug in
  741. #    (some versions?) of Ghostscript where Postscript's stdout gets
  742. #    intermingled with the printer drivers output, resulting in
  743. #    corrupted image data.
  744. #
  745. #    CUPS also does grief by adding its own PS code to the input file.
  746. #    We take care of that with the sed command.  Thus, Well Tempered
  747. #    Screening now works!
  748. #
  749. GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
  750.  
  751. foo2zjs-pstops $PSTOPS_OPTS | \
  752. $PREFILTER \
  753. | ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
  754.     -sOutputFile="|cat 1>&3" $GAMMAFILE -_ >/dev/null 2>&1) 3>&1 \
  755. | foo2hp -r$RES -g$DIM -p$PAPER -m$MEDIA -n$COPIES -d$DUPLEX -s$SOURCE \
  756.         $COLOR -b$BPP $CLIP_UL $CLIP_LR $CLIP_LOG $SAVETONER \
  757.         -J "$LPJOB" -U "$USER" \
  758.         $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD -D$DEBUG
  759.  
  760. #
  761. #    Log the command line, for debugging and problem reports
  762. #
  763. if [ -x /usr/bin/logger ]; then
  764.     logger -t "$BASENAME" -p lpr.info -- \
  765.     "$GSBIN $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS $GAMMAFILE"
  766.     logger -t "$BASENAME" -p lpr.info -- \
  767.     "foo2hp -r$RES -g$DIM -p$PAPER -m$MEDIA \
  768. -n$COPIES -d$DUPLEX -s$SOURCE $COLOR -b$BPP $CLIP_UL $CLIP_LR $CLIP_LOG \
  769. $SAVETONER $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD"
  770. fi
  771.  
  772. #
  773. #    Remove cruft
  774. #
  775. if [ $DEBUG -eq 0 ]; then
  776.     for i in crd.ps log usecie.ps selcrd.ps
  777.     do
  778.     file="$ICCTMP.$i"
  779.     [ -f $file ] && rm -f $file
  780.     done
  781.     [ -f "$TMPFILE" ] && rm -f $TMPFILE
  782. fi
  783.  
  784. exit 0
  785.